package com.ipartek.formacion.gestformwww.controlador;

import com.ipartek.formacion.gestformwww.modelo.ModeloCurso;
import com.ipartek.formacion.gestformwww.modelo.beans.Curso;
import com.ipartek.formacion.gestformwww.modelo.beans.excepciones.GestorFormacionExcepcion;
import java.util.ArrayList;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

/**
 *
 * @author Todo el equipo.
 */
public class GuardarCursoAccion implements Accion {


    private final String crearcursos = "crear-curso-accion";
    private final String visualizarcursos = "visualizar-curso-accion";

    /**
     * Descripción: ejecuta la acción de guardado y modificado del curso
     * @param servlet
     * @param request
     * @param response
     * @return devuelve el router que dirige a la página que corresponda (a Inicio o a Principal)
     */
    public AccionRouter ejecuta(HttpServlet servlet, HttpServletRequest request, HttpServletResponse response) {
        Boolean crearcurso = true;
        HttpSession sesion = request.getSession();
          AccionServlet as=(AccionServlet) servlet;
        String nombre;
        String tipo;
        String codigo;
        String cliente;
        String lugar;
        String lugarnuevo;
        String proyector;
        String correo;
        String aplazado;
        String fechaini;
        String fechafin;
        String horaini;
        String horafin;
        String duracion;
        String duracionmin;
        String plazoreserva;
        String totalfaltas;
        String faltasmes;
        String observaciones;
        Curso curso = new Curso();
        ArrayList<String> errorm = new ArrayList<String>();
        ArrayList<String> mensajes = new ArrayList<String>();
        int id = -1;
        ModeloCurso modelo = (ModeloCurso) servlet.getServletContext().getAttribute("ModeloCurso");
        
        AccionRouter router = null;
        AccionRouter routerAuxiliar = null;
        String aleatorio = (String) sesion.getAttribute("aleatorioCrearCurso");

        if (aleatorio != null) {
            if (request.getParameter("aleatorioCrearCurso") != null) {
                if (request.getParameter("aleatorioCrearCurso").equals(aleatorio)) {
                    // Si se pulsa F5 o atras el aleatorio del request será igual al de la sesión.
                    // NO debe crease un curso (ya se creo anteriormente)
                    crearcurso = false;
                } else {
                    sesion.setAttribute("aleatorioCrearCurso", request.getParameter("aleatorioCrearCurso"));
                }
            }
        } else {
            sesion.setAttribute("aleatorioCrearCurso", request.getParameter("aleatorioCrearCurso"));
        }

        if (sesion.getAttribute("usuario") != null && request.getParameter("curNom") != null && request.getMethod().equalsIgnoreCase("POST")) {
//            ModeloCurso modelo = (ModeloCurso) servlet.getServletContext().getAttribute("ModeloCurso");
            nombre = (String) request.getParameter("curNom");
            tipo = (String) request.getParameter("tipoCur");
            codigo = (String) request.getParameter("curCodINEM");
            cliente = (String) request.getParameter("cliente");
            lugar = (String) request.getParameter("lugar");
            lugarnuevo = (String) request.getParameter("lugars");
            proyector = (String) request.getParameter("curProyector");
            correo = (String) request.getParameter("enviarCorreo");
            aplazado = (String) request.getParameter("curAplazado");
            fechaini = (String) request.getParameter("curFchaInReal");
            fechafin = (String) request.getParameter("curFchaFinReal");
            horaini = (String) request.getParameter("curHoraInicio");
            horafin = (String) request.getParameter("curHoraFin");
            duracion = (String) request.getParameter("curDuracion");
            duracionmin = (String) request.getParameter("curDuracionMinutos");
            plazoreserva = (String) request.getParameter("curPlazoReserva");
            totalfaltas = (String) request.getParameter("curTotalFaltas");
            faltasmes = (String) request.getParameter("curFaltasMes");
            observaciones = (String) request.getParameter("curObservacion");

            if (request.getParameter("idCurso") != null) {
                curso.setCurId(Integer.parseInt(request.getParameter("idCurso")));
            }

            if (!Verificador.esCorrecto(nombre)) {
                errorm.add("error-nombre-curso-incorrecto");
            } else {
                curso.setCurNom(nombre);
            }
            if (!Verificador.numeroValido(tipo, false)) {
                errorm.add("error-tipo-curso-vacio");
            } else {
                curso.setTipCurId(Integer.parseInt(tipo));
            }
            if (!Verificador.caracteresCorrectos(codigo)) {
                errorm.add("error-codigo-curso-incorrecto");
            } else {
                curso.setCurCodINEM(codigo);
            }

            if (!Verificador.numeroValido(cliente, true)) {
                errorm.add("error-codigo-cliente-incorrecto");
            } else {
                curso.setCliId(cliente);
            }

            if (!Verificador.caracteresCorrectos(lugarnuevo)) {
                errorm.add("error-lugar-curso-incorrecto");
            } else {
                if (lugar.trim().isEmpty()) {
                    curso.setCurLugarImpartido(lugarnuevo);
                } else {
                    curso.setCurLugarImpartido(lugar);
                }
            }

            curso.setCurProyector(proyector);
            curso.setEnviarCorreo(correo);
            curso.setCurAplazado(aplazado);

            if (fechaini.trim().isEmpty()) {
                errorm.add("error-fecha-inicio-curso-vacio");
            } else {
                curso.setCurFchaInReal(fechaini);
            }
            if (fechafin.trim().isEmpty()) {
                errorm.add("error-fecha-fin-curso-vacio");
            } else {
                curso.setCurFchaFinReal(fechafin);
            }
            if (!Verificador.validarHora(horaini, false)) {
                errorm.add("error-hora-inicio-curso-incorrecto");
            } else {
                curso.setCurHoraInicio(horaini);
            }
            if (!Verificador.validarHora(horafin, false)) {
                errorm.add("error-hora-fin-curso-incorrecto");
            } else {
                curso.setCurHoraFin(horafin);
            }
            if (!Verificador.numeroValido(duracion, true)) {
                errorm.add("error-duracion-curso-incorrecto");
            } else {
                curso.setCurDuracion(duracion);
            }
            if (!Verificador.minutoValido(duracionmin)) {
                errorm.add("error-duracion-min-curso-incorrecto");
            } else {
                curso.setCurDuracionMinutos(duracionmin);
            }
            if (!Verificador.numeroValido(plazoreserva, true)) {
                errorm.add("error-plazoreserva-curso-incorrecto");
            } else {
                curso.setCurPlazoReserva(plazoreserva);
            }
            if (!Verificador.numeroValido(totalfaltas, true)) {
                errorm.add("error-faltastotales-curso-incorrecto");
            } else {
                curso.setCurTotalFaltas(totalfaltas);
            }
            if (!Verificador.numeroValido(faltasmes, true)) {
                errorm.add("error-faltasmes-curso-incorrecto");
            } else {
                curso.setCurFaltasMes(faltasmes);
            }
            if (!Verificador.compararFaltas(totalfaltas, faltasmes)) {
                errorm.add("error-faltastotales-altasmes");
            }

            curso.setCurObservacion(observaciones);

            if (!Verificador.ordenFechasCorrecto(fechaini, fechafin)) {
                errorm.add("error-orden-fechas-curso");
            }
            if (!Verificador.ordenHorasCorrecto(horaini, horafin)) {
                errorm.add("error-orden-hora-curso");
            }

            if (errorm.isEmpty() && crearcurso) {
                if (request.getParameter("idCurso") == null) {
                    try {
                        id = modelo.crearCurso(curso);
                    } catch (GestorFormacionExcepcion ex) {
                        Logger.getLogger(GuardarCursoAccion.class.getName()).log(Level.SEVERE, null, ex);
                        sesion.setAttribute("excepciones", ex.getMessage());
                    }
                } else {
                    try {
                        //curso.setCurId(Integer.parseInt(request.getParameter("idCurso"))); VA ARRIBA
                        id = modelo.modificarCurso(curso);
                    } catch (GestorFormacionExcepcion ex) {
                        Logger.getLogger(GuardarCursoAccion.class.getName()).log(Level.SEVERE, null, ex);
                        sesion.setAttribute("excepciones", ex.getMessage());
                    }
                }
                if (id < 0) {
                    try {
                        //request.setAttribute("contenido", "crear-curso");
                        routerAuxiliar=as.getFactory().getAction(as.getNombreClaseRecurso(crearcursos),servlet.getClass().getClassLoader()).ejecuta(servlet, request, response);
                    } catch (ClassNotFoundException ex) {
                        Logger.getLogger(GuardarCursoAccion.class.getName()).log(Level.SEVERE, null, ex);
                    } catch (InstantiationException ex) {
                        Logger.getLogger(GuardarCursoAccion.class.getName()).log(Level.SEVERE, null, ex);
                    } catch (IllegalAccessException ex) {
                        Logger.getLogger(GuardarCursoAccion.class.getName()).log(Level.SEVERE, null, ex);
                    }
               
                    errorm.add("error-curso-nocreado");
                    request.setAttribute("errores", errorm);
                } else {
                    //request.setAttribute("contenido", "visualiza-curso");
                    request.setAttribute("idCurso", id);
                    mensajes.add("mensaje-guardar-curso");
                    sesion.setAttribute("mensajes", mensajes);
                     try {
                        //request.setAttribute("contenido", "crear-curso");
                        routerAuxiliar=as.getFactory().getAction(as.getNombreClaseRecurso(visualizarcursos),servlet.getClass().getClassLoader()).ejecuta(servlet, request, response);
                    } catch (ClassNotFoundException ex) {
                        Logger.getLogger(GuardarCursoAccion.class.getName()).log(Level.SEVERE, null, ex);
                    } catch (InstantiationException ex) {
                        Logger.getLogger(GuardarCursoAccion.class.getName()).log(Level.SEVERE, null, ex);
                    } catch (IllegalAccessException ex) {
                        Logger.getLogger(GuardarCursoAccion.class.getName()).log(Level.SEVERE, null, ex);
                    }
            

                }
            } else {
                if (crearcurso) {
                    request.setAttribute("errores", errorm);
                    if (request.getParameter("idCurso") == null) {
                         try {
                        //request.setAttribute("contenido", "crear-curso");
                        routerAuxiliar=as.getFactory().getAction(as.getNombreClaseRecurso(crearcursos),servlet.getClass().getClassLoader()).ejecuta(servlet, request, response);
                    } catch (ClassNotFoundException ex) {
                        Logger.getLogger(GuardarCursoAccion.class.getName()).log(Level.SEVERE, null, ex);
                    } catch (InstantiationException ex) {
                        Logger.getLogger(GuardarCursoAccion.class.getName()).log(Level.SEVERE, null, ex);
                    } catch (IllegalAccessException ex) {
                        Logger.getLogger(GuardarCursoAccion.class.getName()).log(Level.SEVERE, null, ex);
                    }
                  
                        //request.setAttribute("contenido", "crear-curso");
                    } else {
                          try {
                        //request.setAttribute("contenido", "crear-curso");
                        routerAuxiliar=as.getFactory().getAction(as.getNombreClaseRecurso(visualizarcursos),servlet.getClass().getClassLoader()).ejecuta(servlet, request, response);
                    } catch (ClassNotFoundException ex) {
                        Logger.getLogger(GuardarCursoAccion.class.getName()).log(Level.SEVERE, null, ex);
                    } catch (InstantiationException ex) {
                        Logger.getLogger(GuardarCursoAccion.class.getName()).log(Level.SEVERE, null, ex);
                    } catch (IllegalAccessException ex) {
                        Logger.getLogger(GuardarCursoAccion.class.getName()).log(Level.SEVERE, null, ex);
                    }
                    
                        //request.setAttribute("contenido", "visualiza-curso");
                    }
                } else {
                    // Falta la llamada al metodo de la clase abstracta AccionCurso
                       try {
                        //request.setAttribute("contenido", "crear-curso");
                        routerAuxiliar=as.getFactory().getAction(as.getNombreClaseRecurso(visualizarcursos),servlet.getClass().getClassLoader()).ejecuta(servlet, request, response);
                    } catch (ClassNotFoundException ex) {
                        Logger.getLogger(GuardarCursoAccion.class.getName()).log(Level.SEVERE, null, ex);
                    } catch (InstantiationException ex) {
                        Logger.getLogger(GuardarCursoAccion.class.getName()).log(Level.SEVERE, null, ex);
                    } catch (IllegalAccessException ex) {
                        Logger.getLogger(GuardarCursoAccion.class.getName()).log(Level.SEVERE, null, ex);
                    }
                  
                    request.setAttribute("contenido", "lista-cursos");
                }
            }
            router = routerAuxiliar;
        } else {
            router = new AccionRouter("inicio");
        }
        return router;
    }

   
}
